package com.brillilab.domain.vo.user;

import com.brillilab.domain.enums.lab.LabMemberPowerEnum;
import com.brillilab.domain.enums.lab.UserEnum;
import com.brillilab.domain.po.lab.LabMemberPower;
import com.brillilab.domain.vo.home.HomeInviteCodeItemVo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.springframework.util.CollectionUtils;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

@Data
public class UserInfoVo implements Serializable {

	private static final long serialVersionUID = 1L;

	/**
	 * 用户ID
	 */
	private Long id;
	/**
	 * 当前所在实验室ID lm
	 */
	private Long labId;
	/**
	 * 实验室名称 lm
	 */
	private String labName;
	/**
	 * 实验室成员ID lm
	 */
	private Long labMemberId;
	/**
	 * 用户姓名
	 */
	private String name;
	/**
	 * 用户状态 状态 正常1 冻结2 删除 3
	 */
	private Integer state;
	/**
	 * 手机号
	 */
	private String mobile;
	/**
	 * 邮箱
	 */
	private String email;
	/**
	 * 性别 1-男 2-女
	 */
	private Integer sex;
	/**
	 * 性别名称
	 */
	private String sexName;
	/**
	 * 头像图片
	 */
	private String imageUrl;
	/**
	 * 用户token
	 */
	private String token;
	/**
	 * 证件号
	 */
	@JsonIgnore
	private String certificateNo;
	/** 职称 lm */
	private String duty;
	/**
	 * 实验室所有人ID lm
	 */
	private Long ownerId;
	/**
	 * 权限列表 lm
	 */
	private List<LabMemberPower> powers;
	/**
	 * vip 实验室 lb
	 * */
	private int isVip = 0;
	/**
	 * 实验室数量
	 */
	private int labNum = 0;
	/**
	 * 是否是小组长
	 */
	private int isTeamLeader;
	/**
	 * 最后登录时间
	 */
	private Date lastLoginTime;
	/**
	 * 是否修改过密码（0否，1是）
	 */
	private int isChangedPwd;
	/**
	 * 实验室过期时间 (天)
	 */
	private long expireDays;
	/**
	 * 是否已过期
	 */
	private boolean hasExpired=false;
	/**
	 * 过期提示文案
	 */
	private String expiredText;
	/**
	 * 客服微信号
	 */
	private String kfWxAccount;
	/**
	 * 过期提示文案是否弹出
	 */
	private boolean expiredTextAlert=false;
	/**
	 * 实验室付费类型(1免费，2试用，3VIP)
	 */
	private Integer labPayType;
	/**
	 * pi首次登录时间
	 */
	private Date piFirstLoginTime;
	/**
	 * 是否需要显示邀请码
	 */
	private boolean showInviteCode=false;

	/**
	 * 剩余可用数
	 */
	private Integer remainCount;

	/**
	 * 邀请码列表
	 */
	private List<HomeInviteCodeItemVo> inviteCodeList;

	/**
	 * 用户付费类型(1免费，2试用，3VIP)
	 */
	private Integer userPayType;

	/**
	 * 邀请码列表提示语
	 */
	private String tips;

	/**
	 * 过期时间
	 */
	private Date expireDate;

	public String getSexName() {
		return sex == null ? "未知" : UserEnum.Sex.getKey(sex);
	}

	public Boolean getIsOwner(){
		return this.id.equals(this.ownerId);
	}

	public boolean hasPower(LabMemberPowerEnum.Power power) {
		return CollectionUtils.isEmpty(this.powers) ? false
				: this.powers.stream().anyMatch(s -> s.getPower().equals(power.getValue()));
	}
}
